package com.johann.classify;


//给定一个排序好的数组，找出给定数字的下标
/*
* 定义左右边界(下标) L R
* 还有中间点（下标）M 其中M=floor(L+R)/2
* 循环终止条件是 L>M
* 如果target == M 返回 M；
* 如果target < M 则 M+1 与 R之间 继续搜
* 如果target > M 则 L 与 M-1之间 继续搜
* */

import static java.lang.Math.abs;

public class BinarySearch {
    private static final byte NUM= 110;
    private static final int MAX_VALUE= Integer.MAX_VALUE;

    private Byte[] commonArray(){
        Byte [] ins = {19, 32,54, 66, 77, 88, 99, 107, 110, 119, 120};
        return ins;
    }

    public int binarySearch001(int targetNum){
        int l = 0;
        int r = commonArray().length-1;
        int m ;
        while(l<=r){
            m = (l+r)/2;
            if(targetNum == commonArray()[m]) return m;
            else if(targetNum > commonArray()[m]){
                l=m+1;
            }
            else{
                r=m-1;
            }
        }
        return -1;
    }
//byte的取值范围-128~127
/*
* >>> 无符号右移 忽略符号位，空位补0
* >>  右移       相当于 /2
* <<  左移       相当于 *2
*
* */


    public byte binarySearch002(byte targetNum){
          byte l=0;
          byte r=(byte)(commonArray().length-1);
          byte m;
          while (l<=r){
//              m=(byte)((l+r)/2);        //这么写肯定相加的数值会溢出，有可能出错；
//             m=(byte)(l+(r-l)/2);    //利用数学方法，使其相加得到的值不超过127;
              m= (byte) ((l+r)>>1);
              if(targetNum == commonArray()[m]) return m;
              else if(targetNum > commonArray()[m]){
                  l=(byte)(m+1); //中间值付给 左界
              }
              else
              {
                  r=(byte)(m-1);
              }

          }
          return -1;
    }



    public void movePosition(){
        int a=-36;
        int b=2;

        int c=abs(a)>>b;        // 36/4=9
        int e=abs(a)>>>b;       // 36/4=9
        int d=abs(a)<<b;        // 36*4=144

        int f=a>>1;             // -36/2=-18
        /*
        对于正数而言，符号位为0，负数的符号位为1

        正数的原码、反码、补码都一样

        负数的反码=原码符号位不变，其他位取反
        负数的补码=反码+1

        -36
        原码：1000 0000  0000 0000  0000 0000  0010 0100
        反码：1111 1111  1111 1111  1111 1111  1101 1011
        补码：1111 1111  1111 1111  1111 1111  1101 1100

        -36>>1 （右移运算，符号位不变，低位移除，高位补符号位）
        补码：1111 1111  1111 1111  1111 1111  1110 1110
        反码：1111 1111  1111 1111  1111 1111  1110 1101
        原码：1000 0000  0000 0000  0000 0000  0001 0010
        计算得出：-18

        -36>>>1（无符号右移，低位移除，高位补零）
        补码：0111 1111  1111 1111  1111 1111  1110 1110
        反码：0111 1111  1111 1111  1111 1111  1110 1110
        原码：0111 1111  1111 1111  1111 1111  1110 1110
        计算得出：2147483630
        */
        int g=a>>>1;            // 2147483630
        int h=a<<1;             // -36
        System.out.println(""+c+" "+e+" "+d);
        System.out.println(""+f+" "+g+" "+h);

        int [] arr=new int[8];
        int size= arr.length-1;
    }

    public static void main(String[] args) {
         new BinarySearch().movePosition();
    }

}
